home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / doc / popularity-contest / examples / popcon-stat.pl < prev    next >
Encoding:
Perl Script  |  2008-11-04  |  4.1 KB  |  169 lines

  1. #! /usr/bin/perl -wT
  2. #
  3. # Require the debian package libchart-perl.
  4.  
  5. #BEGIN {
  6. #@INC=("./usr/share/perl5/", @INC);
  7. #}
  8.  
  9. $ENV{PATH}="/usr/bin:/bin";
  10. $dirpng="../www/stat";
  11. $oneyearago = `date +"%Y-%m-%d" -d "1 year ago"`;
  12.  
  13. while (<>)
  14. {
  15.    my ($file);
  16.    m/^(.*\/popcon-([0-9-]+)\.gz)$/ or next;
  17.    $file=$1;
  18.    $f=$2;
  19.    push @date,$f;
  20.    open FILE,"zcat $file|";
  21.    while(<FILE>)
  22.    {
  23.      my @line=split(/ +/);
  24.      if ($line[0] eq "Submissions:")
  25.      {
  26.        $subt{$f}=$line[1];
  27.      }
  28.      elsif ($line[0] eq "Architecture:")
  29.      {
  30.        $sub{$f}->{$line[1]}=$line[2];
  31.        $arch{$line[1]}++;
  32.      }
  33.      elsif ($line[0] eq "Release:")
  34.      {
  35.        if (defined($line[2]))
  36.        {
  37.          if ($line[1] =~ m/^([0-9]+(?:\.[0-9]+)*)/)
  38.          {
  39.            $rel{$f}->{"$1"}+=$line[2];
  40.          } else {
  41.            $rel{$f}->{"unknown"}+=$line[2];
  42.          }
  43.        } else {
  44.          $rel{$f}->{"unknown"}+=$line[1];
  45.        }
  46.      }
  47.      elsif ($line[0] eq "Package:")
  48.      {
  49.        last;
  50.      }
  51.    }
  52.    close FILE;
  53. }
  54.  
  55. sub ytick
  56. {
  57.   my ($x)=$_[0]-.5;
  58.   $x < 0 and return 0;
  59.   return int 2**$x;
  60. }
  61.  
  62. use Chart::LinesPoints;
  63.  
  64. sub getsub
  65. {
  66.   my ($day,$r)=@_;
  67.   return defined($sub{$day}->{$r})?$sub{$day}->{$r}:0;
  68. }
  69.  
  70. sub submission_chart
  71. {
  72.   my ($pngname,$startdate,$ticks,$title)=@_;
  73.   my (@days) = sort grep { defined($sub{$_}->{'i386'}) } @date;
  74.   @days = sort grep { $_ ge $startdate } @days;
  75.   my (@data) = (\@days);
  76.   my ($today)=$days[-1];
  77.   my (@arch)= sort {getsub($today,$b) <=> getsub($today,$a)} (keys %arch);
  78.   $maxv = -10;
  79.   for $arch (@arch)
  80.   {
  81.       my @res=();
  82.       for (@days)
  83.       {
  84.           my $data=defined($sub{$_}->{$arch})?log($sub{$_}->{$arch})/log(2)+1:0;
  85.           push @res,$data;
  86.           $maxv=$data if ($data > $maxv);
  87.       }
  88.       push @data,\@res;
  89.   }
  90.  
  91.   $obj=Chart::LinesPoints->new (600,400);
  92.   $obj->set ('title' => "Number of submissions per architectures $title");
  93.   $obj->set ('legend_labels' => [@arch]);
  94.   $obj->set ('f_y_tick' => \&ytick);
  95.   $obj->set ('brush_size' => 3);
  96.   $obj->set ('pt_size' => 7);
  97.   $obj->set ('max_val' => $maxv+1);
  98.   $obj->set ('max_y_ticks' => 30);
  99.   $obj->set ('y_ticks' => int $maxv +1);
  100.   $obj->set ('x_ticks' => 'vertical');
  101.   $obj->set ('skip_x_ticks' => $ticks);
  102.   $obj->png ("$dirpng/submission$pngname.png", \@data);
  103. }
  104.  
  105. submission_chart ("","0000-00-00",42,"");
  106. submission_chart ("-1year",$oneyearago,14,"(last 12 months)");
  107.  
  108. use Chart::Composite;
  109. my (@days) = sort grep { defined($sub{$_}->{'i386'}) } @date;
  110. my (@arch)= sort (keys %arch);
  111. for $arch (@arch)
  112. {
  113.   my @data;
  114.   my @res=();
  115.   my @tot=();
  116.   for (@days)
  117.   {
  118.     push @res,defined($sub{$_}->{$arch})?$sub{$_}->{$arch}:0;
  119.     push @tot,defined($subt{$_})?$subt{$_}:0;
  120.   }
  121.   @data=(\@days,\@res,\@tot);
  122.   @labels=($arch, 'all submissions');
  123.   $obj=Chart::Composite->new (700,400);
  124.   $obj->set ('title' => "Number of submissions for $arch");
  125.   $obj->set ('legend_labels' => \@labels);
  126.   $obj->set ('brush_size' => 3);
  127.   $obj->set ('pt_size' => 7);
  128.   $obj->set ('x_ticks' => 'vertical');
  129.   $obj->set ('skip_x_ticks' => 42);
  130.   $obj->set ('composite_info' => [ ['LinesPoints', [1]], ['LinesPoints', [2] ] ]); 
  131.   $obj->png ("$dirpng/sub-$arch.png", \@data);
  132. }
  133.  
  134. sub getrel
  135. {
  136.   my ($day,$r)=@_;
  137.   return defined($rel{$day}->{$r})?$rel{$day}->{$r}:0;
  138. }
  139.  
  140. sub release_chart
  141. {
  142.   my ($pngname,$startdate,$ticks,$title)=@_;
  143.   my (@days) = sort grep { $_ ge $startdate } @date;
  144.   my (%release) = map { map { $_ => 1 } keys %{$rel{$_}}  } @days;
  145.   my (@data) = (\@days);
  146.   my ($today)=$days[-1];
  147.   my (@release)= sort {getrel($today,$b) <=> getrel($today,$a)} (keys %release);
  148.   for $release (@release)
  149.   {
  150.     my @res=();
  151.     for (@days)
  152.     {
  153.       my $data=getrel($_,$release);
  154.       push @res,$data;
  155.     }
  156.     push @data,\@res;
  157.   }
  158.   $obj=Chart::LinesPoints->new (600,400);
  159.   $obj->set ('title' => "popularity-contest versions in use $title");
  160.   $obj->set ('legend_labels' => [@release]);
  161.   $obj->set ('brush_size' => 3);
  162.   $obj->set ('pt_size' => 7);
  163.   $obj->set ('x_ticks' => 'vertical');
  164.   $obj->set ('skip_x_ticks' => $ticks);
  165.   $obj->png ("$dirpng/release$pngname.png", \@data);
  166. }
  167. release_chart ("","2004-05-14",42,"");
  168. release_chart ("-1year",$oneyearago,14,"(last 12 months)");
  169.